/********************* единственный что заработал - 9600 - 8мгц кварцЕГ********************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 02.12.2012
Author  : ***
Company : 
Comments: 


Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 4,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 161
char rx_buffer[RX_BUFFER_SIZE];
char lcdbuffer[160];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter;


#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
char flagmy=0;
//char lcdbuffer[1];
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// Standard Input/Output functions
#include <stdio.h>

// Alphanumeric LCD functions
#include <lcd4x40.h>
#include <delay.h>


void Clear_buffers(void)  // Очистка входного массива и массива данных
{
int rx_buffer0_index=RX_BUFFER_SIZE;
//printf("в чистке буфера \n\r"); 
 while (rx_buffer0_index)
  {
  
   rx_buffer[--rx_buffer0_index]=0;
  }

  rx_buffer0_index=0; 

//printf("лечим индексы \n\r"); 
rx_wr_index=0;
rx_rd_index=0;
rx_counter=0;
rx_buffer_overflow=0;
};

void out(void) {
char n;
char data;

    for (n=0;n<160;n++) {
    
    data=rx_buffer[n]; 
        if (data==132) {data=0x22;}
        else if (data==145) {data=0x27;}
        else if (data==146) {data=0x27;}
        else if (data==147) {data=0x22;}
        else if (data==148) {data=0x22;}
        else if (data==150) {data=0x2D;}
        else if (data==168) {data=0xA2;}
        else if (data==171) {data=0x22;}
        else if (data==184) {data=0xB5;}
        else if (data==185) {data=0x23;}
        else if (data==187) {data=0x22;}
        else if (data==192) {data=0x41;}
        else if (data==193) {data=0xA0;}
        else if (data==194) {data=0x42;}
        else if (data==195) {data=0xA1;}
        else if (data==196) {data=0xE0;}
        else if (data==197) {data=0x45;}
        else if (data==198) {data=0xA3;}
        else if (data==199) {data=0xA4;}
        else if (data==200) {data=0xA5;}
        else if (data==201) {data=0xA6;}
        else if (data==202) {data=0x4B;}
        else if (data==203) {data=0xA7;}
        else if (data==204) {data=0x4D;}
        else if (data==205) {data=0x48;}
        else if (data==206) {data=0x4F;}
        else if (data==207) {data=0xA8;}
        else if (data==208) {data=0x50;}
        else if (data==209) {data=0x43;}
        else if (data==210) {data=0x54;}
        else if (data==211) {data=0xA9;}
        else if (data==212) {data=0xAA;}
        else if (data==213) {data=0x58;}
        else if (data==214) {data=0xE1;}
        else if (data==215) {data=0xAB;}
        else if (data==216) {data=0xAC;}
        else if (data==217) {data=0xE2;}
        else if (data==218) {data=0xAD;}
        else if (data==219) {data=0xAE;}
        else if (data==220) {data=0x62;}
        else if (data==221) {data=0xAF;}
        else if (data==222) {data=0xB0;}
        else if (data==223) {data=0xB1;}
        else if (data==224) {data=0x61;}
        else if (data==225) {data=0xB2;}
        else if (data==226) {data=0xB3;}
        else if (data==227) {data=0xB4;}
        else if (data==228) {data=0xE3;}
        else if (data==229) {data=0x65;}
        else if (data==230) {data=0xB6;}
        else if (data==231) {data=0xB7;}
        else if (data==232) {data=0xB8;}
        else if (data==233) {data=0xB9;}
        else if (data==234) {data=0xBA;}
        else if (data==235) {data=0xBB;}
        else if (data==236) {data=0xBC;}
        else if (data==237) {data=0xBD;}
        else if (data==238) {data=0x6F;}
        else if (data==239) {data=0xBE;}
        else if (data==240) {data=0x70;}
        else if (data==241) {data=0x63;}
        else if (data==242) {data=0xBF;}
        else if (data==243) {data=0x79;}
        else if (data==244) {data=0xE4;}
        else if (data==245) {data=0x78;}
        else if (data==246) {data=0xE5;}
        else if (data==247) {data=0xC0;}
        else if (data==248) {data=0xC1;}
        else if (data==249) {data=0xE6;}
        else if (data==250) {data=0xC2;}
        else if (data==251) {data=0xC3;}
        else if (data==252) {data=0xC4;}
        else if (data==253) {data=0xC5;}
        else if (data==254) {data=0xC6;}
        else if (data==255) {data=0xC7;} 
        lcdbuffer[n]=data; 
    };
        
          
         lcd_clear();   
        
         lcd_puts (lcdbuffer);
         
     //lcd_puts(rx_buffer);
     Clear_buffers();
}


// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
//lcd_gotoxy(0,3);
//sprintf(lcdbuffer,"%c",data);
//lcd_gotoxy(0,0);
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {  
     if (/*(data!=32) &&*/ (data!=10)&& (data!=13)) {
   // замена

   
   if (data==62) {
      if (rx_wr_index==160)
      {                  
         out();
         return;
      }
     else{
        lcd_clear();   
        
             
             sprintf(lcdbuffer,"Transmit error, expected '>' at position %d but found at position %d",160, rx_wr_index);
             lcd_puts (lcdbuffer);
     //lcd_puts(rx_buffer);
     Clear_buffers();
     
     
     }
     
   }
   else {
        rx_buffer[rx_wr_index]=data;
        rx_wr_index++;
         
   }
     
     

    
     
  
     //sprintf(lcdbuffer,"%c",rx_buffer[rx_wr_index]); 
     //s[0]=printf("%c",rx_buffer[rx_wr_index]);  
     
    // lcd_putchar (data);
   
   
 //  char flagmy=0;
   
   
    
   
#if RX_BUFFER_SIZE == 256
   // special case for receiver buffer size=256
   if (++rx_counter == 0) rx_buffer_overflow=1;
#else
   if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      }
#endif
   } 
   };
}

#asm
    .equ __lcd_port=0x1b ;PORTA 
  // .equ __lcd_port=0x12; PORTD  /* ЖКИ дисплей подключили к порту I/O D*/

#endasm








#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif



// Declare your global variables here




void main(void)
{

int i;


// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")
lcd_init();
//
lcd_puts (":)");

delay_ms(200);
lcd_clear();
//for (i=160;i<=255;i++) {
//
//sprintf( lcdbuffer,"%c = %X    ",i,i); 
//    lcd_puts(lcdbuffer);
//    delay_ms(2000);
//}
while (1)
      {
//          if (getchar()==62) {
//     lcd_clear();   
//     lcd_puts(rx_buffer);    
//     Clear_buffers();
//     
//     }



       //lcd_clear();
      //sprintf( lcd_buffer,"%c = %d     %c = %d       %c = %d  ",rx_buffer[0],rx_buffer[0],rx_buffer[1],rx_buffer[1],rx_buffer[2],rx_buffer[2]); 
     //
      //#asm("cli")
      // lcd_puts(rx_buffer);
      //Clear_buffers();
      //sprintf( lcd_buffer,"%c = %d     %c = %d       %c = %d  ",rx_buffer[0],rx_buffer[0],rx_buffer[1],rx_buffer[1],rx_buffer[2],rx_buffer[2]); 
      //lcd_puts(lcd_buffer);
     // lcd_clear();
      // lcd_puts(rx_buffer);
     // Clear_buffers();
    //  flag=0;
    //  _lcd_write_data ();
        
    
  //  lcd_clear();   
  //       for (i=0;i<40;i++) {
             //lcd_putchar (rx_buffer[i]);   
             //lcd_putchar (getchar());
  //       }
     //lcd_puts(rx_buffer);
  //   Clear_buffers();
     
  //   delay_ms(2000);
      
}
}
      
      
      
      
         
